package com.hw.springquartz.config;

import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

@Configuration

public class QuartzConfig {
	
	@Bean("jobDetail")
	public MethodInvokingJobDetailFactoryBean detailFactoryBean(ScheduleTask task) {
		MethodInvokingJobDetailFactoryBean jobDetail=new MethodInvokingJobDetailFactoryBean();
		 /*
         *  是否并发执行
         *  例如每5s执行一次任务，但是当前任务还没有执行完，就已经过了5s了，
         *  如果此处为true，则下一个任务会执行，如果此处为false，则下一个任务会等待上一个任务执行完后，再开始执行
         */
		jobDetail.setConcurrent(false);
		// 设置任务的分组，这些属性都可以存储在数据库中，在多任务的时候使用
		jobDetail.setGroup("hw");
		// 设置任务的名字
		jobDetail.setName("hw-task");
        //为需要执行的实体类对应的对象
		jobDetail.setTargetObject(task);
		/*
         * info为需要执行的方法
         * 通过这几个配置，告诉JobDetailFactoryBean我们需要执行定时执行ScheduleTask类中的info方法
         */
		jobDetail.setTargetMethod("info");
		return jobDetail;
	}
	
	@Bean("jobTrigger")
	public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) {
		CronTriggerFactoryBean triggerFactoryBean=new CronTriggerFactoryBean();
		triggerFactoryBean.setJobDetail(jobDetail.getObject());
		triggerFactoryBean.setCronExpression("*/10 * * * * ?");// 初始时的cron表达式
		triggerFactoryBean.setName("hw-trigger");
		return triggerFactoryBean;
	}
	
	@Bean("scheduler")
	public SchedulerFactoryBean scheduler(Trigger trigger) {
		SchedulerFactoryBean schedulerFactoryBean=new SchedulerFactoryBean();
		// 用于quartz集群,QuartzScheduler 启动时更新己存在的Job
		schedulerFactoryBean.setOverwriteExistingJobs(true);
		// 延时启动，应用启动1秒后
		schedulerFactoryBean.setStartupDelay(1);
		// 注册触发器
		schedulerFactoryBean.setTriggers(trigger);
		return schedulerFactoryBean;
	}

}
